from fastapi import FastAPI, HTTPException
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_community.llms import Ollama
from langserve import add_routes
from langchain_core.tools import tool

# 初始化大模型
llm = Ollama(model="dolphin-llama3:70b", num_ctx=8192, num_thread=32)

# Prompt 模板
template = """你是一个中文对话引导助手，请根据以下提供的信息，引导用户正确理解事件。

事件主题：{event}
引导方向：{guideline}
用户的错误言论：{misconception}

请生成一段简洁、有说服力的引导性文本，帮助用户更好地理解事件并朝正确方向思考。
注意：不要说明你的身份，不要指责用户，用理性语气纠正误区，只使用中文回答，生成的内容尽量简短。
引导性对话回复："""

prompt = PromptTemplate.from_template(template)
output_parser = StrOutputParser()

# 封装成工具函数 + 路由自动注册
@tool
def generate_guidance(event: str = None, guideline: str = None, misconception: str = None) -> str:
    """根据事件、引导方向和用户误解生成观点引导文本"""
    input_text = prompt.format(
        event=event,
        guideline=guideline,
        misconception=misconception
    )
    response = llm.invoke(input_text)
    return output_parser.invoke(response)

# 创建 FastAPI 应用
app = FastAPI(
    title="观点引导服务",
    version="1.0",
    description="根据用户输入生成纠正和引导观点的文本"
)

# 自动添加路由：POST /generate-guidance/invoke
add_routes(app, generate_guidance, path="/generate-guidance")

# Prompt 模板
template_dia = """你是一个中文对话助手。
你将收到一个关于社会、科技、文化等领域的事件主题，以及用户的相关观点。
同时你会被指定一个立场（支持或反对用户观点），请你根据该立场，用理性、委婉、具启发性的方式，生成一段简洁、有说服力的中文回复。

请特别注意以下要求：

回复必须站在所给立场（支持或反对）上；

语气理性友善，不批评、不攻击用户；

回复应引导用户更全面或更深入地思考问题；

内容简洁明了，不超过100字；

不要说明你的身份，只使用中文回答。

请根据以下信息生成回复：

事件主题：{title}
用户观点：{comment}
你的立场：{guideline}

你的回复："""

prompt_dia = PromptTemplate.from_template(template_dia)

# 封装成工具函数 + 路由自动注册
@tool
def bot_guidance(botid: str = None, title: str = None, comment: str = None, opinion : int = None) -> dict:
    """根据事件、引导方向和用户误解生成观点引导文本"""
    response = {}
    response['botid'] = botid
    input_text = prompt_dia.format(
        title=title,
        comment=comment,
        guideline= '支持' if opinion==0 else '反对'
    )
    # print(inputd_text)
    response['reply'] = llm.invoke(input_text)
    return response

# 自动添加路由：POST /generate-guidance/invoke
add_routes(app, bot_guidance, path="/bot-guidance")


# Prompt 模板
template_t2i = """
Create a clear, educational image contrasting {comment} with {guideline}. Focus on rich visual detail and balanced composition: the correct concept dominates the scene, shown in realistic or semi-realistic lighting with positive, progressive elements. The incorrect idea appears smaller and secondary. Absolutely limit to 77 tokens maximum. No text in the image.
"""

prompt_t2i = PromptTemplate.from_template(template_t2i)

# 封装成工具函数 + 路由自动注册
@tool
def generate_t2i_prompt(comment: str = None, guideline: str = None) -> str:
    """根据事件、引导方向和用户误解生成图片的提示词"""
    input_text = prompt_t2i.format(
        comment=comment,
        guideline=guideline
    )
    response = llm.invoke(input_text)
    print(response)
    return response

# 自动添加路由：POST /generate-guidance/invoke
add_routes(app, generate_t2i_prompt, path="/generate-t2i-prompt")

# 启动服务（本地调试）
if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=25602)